package cn.tedu.charging.order.rabbitmq;

import cn.tedu.charging.order.common.OrderStatusConstants;
import cn.tedu.charging.order.config.RabbitConfiguration;
import cn.tedu.charging.order.dao.mapper.OrderSuccessMapper;
import cn.tedu.charging.order.pojo.po.ChargingOrderSuccessPO;
import cn.tedu.charging.order.pojo.po.OrderMQPO;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.rabbitmq.client.Channel;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Slf4j
@Component
public class RabbitMQConsumer {


    @Autowired
    private OrderSuccessMapper orderSuccessMapper;

    /**
     * 通过Spring封装好的 注解 @RabbitListener来消费消息
     * queues 用来指定要消费的队列,
     * 不去消费正常的队列
     * 去消费死信队列 用来实现延迟消息
     * @param orderMQPO
     */
    //@RabbitListener(queues = RabbitConfiguration.QUEUE_NAME)
    @RabbitListener(queues = RabbitConfiguration.DEAD_LETTER_QUEUE_NAME)
    public void receive(OrderMQPO orderMQPO , Message message, Channel channel) {
       log.debug("消费到延迟消息:{}",orderMQPO);
        //1 先查询  sql
        //2 判断状态
        //3 如果是充电中 修改为异常结束 sql
        //update 成功订单表 set 充电状态 = 异常结束 where 订单号 = 订单号 and 充电状态 = 充电中
        //更新的目标值  set 充电状态 = 异常结束
        ChargingOrderSuccessPO chargingOrderSuccessPO = new ChargingOrderSuccessPO();
        //设置订单状态为异常结束
        chargingOrderSuccessPO.setBillStatus(OrderStatusConstants.ORDER_STATUS_EXCEPTION_END);
        //设置更新的条件
        UpdateWrapper updateWrapper = new UpdateWrapper();
        //必须传入订单号，如果不传 会更新表里的所有订单状态
        //更新的条件  订单号 = 订单号
        updateWrapper.eq("bill_id",orderMQPO.getOrderNo());
        //更新的条件  充电状态 = 充电中
        updateWrapper.eq("bill_status",OrderStatusConstants.ORDER_STATUS_PROCESS);
        log.debug("处理超时订单:目标值:{},条件:{}",chargingOrderSuccessPO,updateWrapper);
        int row = orderSuccessMapper.update(chargingOrderSuccessPO, updateWrapper);
        log.debug("处理超时订单:目标值:{},条件:{},影响行数:{}",chargingOrderSuccessPO,updateWrapper,row);
        if (row == 0) {
            log.debug("没有更新数据，表示订单正常结束");
        }else {
            log.debug("更新数据，表示订单异常结束");
            log.debug("通知充电用户");
            log.debug("通知设备管理员");
        }

        try {
            //手动ack 确认 确认消息,消费者成功完成了业务，告诉RabbitMQ,消息我处理完，你可以把消息删除了
            channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);
        } catch (Exception e) {
            log.error("确认消息出现异常:{}",e);
        }
    }
}
